/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pl.put.dcs_modeler.wizards.newComputingObject;

import java.awt.Component;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyVetoException;
import java.beans.VetoableChangeListener;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import java.util.logging.Logger;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import org.openide.WizardDescriptor;
import org.openide.util.HelpCtx;

public class NewComputingObjectWizardPanel2 implements WizardDescriptor.Panel
{
    private static Logger log = Logger.getLogger( NewComputingObjectWizardPanel2.class.getName() );
    /**
     * The visual component that displays this panel. If you need to access the
     * component from this class, just use getComponent().
     */
    private NewComputingObjectVisualPanel2 component;
    private WizardDescriptor wizardDescriptor;
    // Get the visual component for the panel. In this template, the component
    // is kept separate. This can be more efficient: if the wizard is created
    // but never displayed, or not all panels are displayed, it is better to
    // create only those which really need to be visible.
    public Component getComponent()
    {
        if ( component == null )
        {
            component = new NewComputingObjectVisualPanel2();
            component.addVetoableChangeListener( new VetoableChangeListener() {

                @Override
                public void vetoableChange( PropertyChangeEvent evt ) throws PropertyVetoException
                {
                    log.info(  "veotable");
                    fireChangeEvent();
                }
            });
        }
        return component;
    }

    @Override
    public HelpCtx getHelp()
    {
        // Show no Help button for this panel:
        return HelpCtx.DEFAULT_HELP;
    // If you have context help:
    // return new HelpCtx(SampleWizardPanel1.class);
    }

    @Override
    public boolean isValid()
    {
        // If it is always OK to press Next or Finish, then:
        log.info( "isValid2");
        return component.isValid( wizardDescriptor );
    // If it depends on some condition (form filled out...), then:
    // return someCondition();
    // and when this condition changes (last form field filled in...) then:
    // fireChangeEvent();
    // and uncomment the complicated stuff below.
    }

 
    
    private final Set<ChangeListener> listeners = new HashSet<ChangeListener>( 1 ); // or can use ChangeSupport in NB 6.0

    @Override
    public final void addChangeListener( ChangeListener l )
    {
        synchronized ( listeners )
        {
            listeners.add( l );
        }
    }

    @Override
    public final void removeChangeListener( ChangeListener l )
    {
        synchronized ( listeners )
        {
            listeners.remove( l );
        }
    }

    protected final void fireChangeEvent()
    {
        Iterator<ChangeListener> it;
        synchronized ( listeners )
        {
            it = new HashSet<ChangeListener>( listeners ).iterator();
        }
        ChangeEvent ev = new ChangeEvent( this );
        while ( it.hasNext() )
        {
            it.next().stateChanged( ev );
        }
    }
     

    // You can use a settings object to keep track of state. Normally the
    // settings object will be the WizardDescriptor, so you can use
    // WizardDescriptor.getProperty & putProperty to store information entered
    // by the user.
    public void readSettings( Object settings )
    {
        wizardDescriptor = ( WizardDescriptor ) settings;
        component.readSettings( wizardDescriptor );
    }

    public void storeSettings( Object settings )
    {
        WizardDescriptor d = ( WizardDescriptor ) settings;
        component.storeSettings( d );
    }
}

